object First {

  /**
   * 计算两个整数的和
   *
   * @param a 第一个整数
   * @param b 第二个整数
   * @return 两个整数的和
   */
  def add(a: Int, b: Int): Int = {
    a + b
  }

  /**
   * 打印任意类型的值到控制台
   *
   * @param a 要打印的值
   */
  private def myPrint(a: Any): Unit = {
    println(a)
  }

  /**
   * 生成问候语
   *
   * @param name 被问候的人名
   * @return 包含问候语的字符串
   */
  def sayHi(name: String): String = {
    println("调用sayHi method")
    "Hi, " + name
  }

  /**
   * 计算圆的面积
   *
   * @param r 圆的半径
   * @param p 圆周率，默认值为3.14
   * @return 圆的面积
   */
  def areaC(r: Double, p: Double = 3.14): Double = {
    p * r * r
  }

  /**
   * 计算圆的面积
   *
   * @param r 圆的半径，默认值为5
   * @param p 圆周率
   * @return 圆的面积
   */
  def area(r: Double = 5, p: Double): Double = {
    p * r * r
  }

  /**
   * 计算多个整数的和
   *
   * @param params 可变长度的整数参数列表
   * @return 所有参数的和
   */
  def sum(params: Int*): Int = {
    var sum = 0
    // 遍历所有参数并累加
    for (param <- params) {
      sum += param
    }
    sum
  }

  /**
   * 两个整数相加的函数字面量
   */
  var addFun = (a: Int, b: Int) => {
    a + b
  }

  /**
   * 两个整数相乘的函数字面量
   */
  var mFun = (a: Int, b: Int) => {
    a * b
  }

  var sayHi = () => {
    "Hi"
  }

  /**
   * 使用传入的函数对两个整数进行计算
   *
   * @param f 用于计算的函数
   * @param a 第一个整数
   * @param b 第二个整数
   * @return 函数计算结果
   */
  def addMethod(f: (Int, Int) => Int, a: Int, b: Int): Int = {
    f(a, b)
  }

  def addMethodx(f: (Int, Int) => Int): Int = {
    f(2, 3)
  }

  /**
   * 程序入口点
   *
   * @param args 命令行参数
   */
  def main(args: Array[String]): Unit = {
    myPrint(addMethod(addFun, 3, 2))
    myPrint(addMethod(mFun, 3, 2))
    println(addMethodx(addFun))
    println(sayHi())
    println(sayHi)
    println("-------------------")
    //立即执行
    val msg = sayHi("yujikuan")
    println("开始执行 1")
    println(msg)
    println("-----------------")
    // 延迟执行
    lazy val msg2 = sayHi("yujikuan")
    println("开始执行2")
    println(msg2)
    // 所有静态的东西，写入到ojbect就行了
    println(Op.add(1, 2))

    /*  myPrint(add(1, 2))
      myPrint(sayHi("于吉宽"))
      myPrint(areaC(5))
      myPrint(area(5,1))
      myPrint(sum(1,2,3,4,5))*/
  }
}
